home *** CD-ROM | disk | FTP | other *** search
/ Revista do CD-ROM 97 / CD-ROM 97 / CD-ROM 97.iso / internet / ghostzilla / ghsetup.exe / chrome / comm.jar / content / editor / sb-bookmarks.js < prev    next >
Encoding:
JavaScript  |  2002-04-09  |  16.8 KB  |  556 lines

  1. /*
  2.  * The contents of this file are subject to the Netscape Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/NPL/
  6.  *
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  *
  12.  * The Original Code is Mozilla Communicator client code, released
  13.  * March 31, 1998.
  14.  *
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation. Portions created by Netscape are
  17.  * Copyright (C) 1999 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Ben Goodger
  22.  */
  23.  
  24.  
  25. /*
  26.   Script for the bookmarks properties window
  27. */
  28.  
  29. function BookmarkProperties()
  30. {
  31.   var tree = document.getElementById('bookmarksTree');
  32.   var select_list = tree.selectedItems;
  33.  
  34.   if (select_list.length >= 1) {
  35.  
  36.   // don't bother showing properties on bookmark separators
  37.   var type = select_list[0].getAttribute('type');
  38.         if (type != "http://home.netscape.com/NC-rdf#BookmarkSeparator")
  39.         {
  40.     var props = window.open("chrome://communicator/content/bookmarks/bm-props.xul",
  41.                                 "BookmarkProperties", "chrome,menubar,resizable");
  42.     props.BookmarkURL = select_list[0].getAttribute("id");
  43.   }
  44.   } else {
  45.     dump("nothing selected!\n");
  46.   }
  47. }
  48.  
  49. function OpenSearch(tabName)
  50. {
  51.   window.openDialog("resource:/res/samples/search.xul", "SearchWindow", "dialog=no,close,chrome,resizable", tabName);
  52. }
  53.  
  54. function OpenURL(event, node)
  55. {
  56.     // clear any single-click/edit timeouts
  57.     if (timerID != null)
  58.     {
  59.         gEditNode = null;
  60.         clearTimeout(timerID);
  61.         timerID = null;
  62.     }
  63.  
  64.     if (node.getAttribute('container') == "true")
  65.     {
  66.         return(false);
  67.     }
  68.  
  69.     var url = node.getAttribute('id');
  70.  
  71.     // Ignore "NC:" urls.
  72.     if (url.substring(0, 3) == "NC:")
  73.     {
  74.         return(false);
  75.     }
  76.  
  77.   try
  78.   {
  79.     // add support for IE favorites under Win32, and NetPositive URLs under BeOS
  80.     if (url.indexOf("file://") == 0)
  81.     {
  82.       var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  83.       if (rdf)   rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
  84.       if (rdf)
  85.       {
  86.         var fileSys = rdf.GetDataSource("rdf:files");
  87.         if (fileSys)
  88.         {
  89.           var src = rdf.GetResource(url, true);
  90.           var prop = rdf.GetResource("http://home.netscape.com/NC-rdf#URL", true);
  91.           var target = fileSys.GetTarget(src, prop, true);
  92.           if (target) target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  93.           if (target) target = target.Value;
  94.           if (target) url = target;
  95.  
  96.         }
  97.       }
  98.     }
  99.   }
  100.   catch(ex)
  101.   {
  102.   }
  103.  
  104.     if(top.isEditor != undefined) {
  105.         dump("yay, top.isEditor is defined\n");
  106.         if(top.editorShell) {
  107.             dump("yay yay, top.editorShell exists, loading URL...\n");
  108.             toEditor(url);
  109.         }
  110.     } else {
  111.         dump("reg'lar bm window\n");
  112.         window.open(url,'bookmarks');
  113.     }
  114.  
  115.     dump("OpenURL(" + url + ")\n");
  116.  
  117.     return(true);
  118. }
  119.  
  120. var htmlInput = null;
  121. var saveNode = null;
  122. var newValue = "";
  123. var timerID = null;
  124. var gEditNode = null;
  125.  
  126. function DoSingleClick(event, node)
  127. {
  128.   var type = node.parentNode.parentNode.getAttribute('type');
  129.   var selected = node.parentNode.parentNode.getAttribute('selected');
  130.  
  131.   if (gEditNode == node) {
  132.     // Only start an inline edit if it is the second consecutive click
  133.     // on the same node that is not already editing or a separator.
  134.     if (!htmlInput &&
  135.         type != "http://home.netscape.com/NC-rdf#BookmarkSeparator") {
  136.       // Edit node if we don't get a double-click in less than 1/2 second
  137.       timerID = setTimeout("OpenEditNode()", 500);
  138.     }
  139.   } else {
  140.     if (htmlInput) {
  141.       // Clicked during an edit
  142.       // Save the changes and move on
  143.       CloseEditNode(true);
  144.     }
  145.     gEditNode = node;
  146.   }
  147.   return false;
  148. }
  149.  
  150. function OpenEditNode()
  151. {
  152.     dump("OpenEditNode entered.\n");
  153.  
  154.     // clear any single-click/edit timeouts
  155.     if (timerID != null)
  156.     {
  157.         clearTimeout(timerID);
  158.         timerID = null;
  159.     }
  160.  
  161.     // XXX uncomment the following line to replace the whole input row we do this
  162.     // (and, therefore, only allow editing on the name column) until we can
  163.     // arbitrarily change the content model (bugs prevent this at the moment)
  164.     gEditNode = gEditNode.parentNode;
  165.  
  166.     var name = gEditNode.parentNode.getAttribute("Name");
  167.     dump("Single click on '" + name + "'\n");
  168.  
  169.     var theParent = gEditNode.parentNode;
  170.     dump("Parent node is a " + theParent.nodeName + "\n\n");
  171.  
  172.     saveNode = gEditNode;
  173.  
  174.     // unselect all nodes!
  175.     var tree = document.getElementById('bookmarksTree');
  176.     tree.clearSelection();
  177.  
  178.     // XXX for now, just remove the child from the parent
  179.     // optimally, we'd like to not remove the child-parent relationship
  180.     // and instead just set a "display: none;" attribute on the child node
  181.  
  182. //    gEditNode.setAttribute("style", "display: none;");
  183. //    dump("gEditNode hidden.\n");
  184.     theParent.removeChild(gEditNode);
  185.     gEditNode = null;
  186.     dump("gEditNode removed.\n");
  187.  
  188.     // create the html:input node
  189.     htmlInput = document.createElementNS("http://www.w3.org/1999/xhtml", "html:input");
  190.     htmlInput.setAttribute("value", name);
  191.     htmlInput.setAttribute("onkeypress", "return EditNodeKeyPress(event)");
  192.  
  193.     theParent.appendChild(htmlInput);
  194.     dump("html:input node added.\n");
  195.  
  196.     htmlInput.focus();
  197.  
  198.     dump("OpenEditNode done.\n");
  199.     return(true);
  200. }
  201.  
  202. function CloseEditNode(saveChangeFlag)
  203. {
  204.     dump("CloseEditNode entered.\n");
  205.  
  206.     if (htmlInput)
  207.     {
  208.         if (saveChangeFlag)
  209.         {
  210.             newValue = htmlInput.value;
  211.         }
  212.         dump("  Got html input: "+newValue+" \n");
  213.  
  214.         var theParent = htmlInput.parentNode;
  215.         theParent.removeChild(htmlInput);
  216.         theParent.appendChild(saveNode);
  217.         dump("  child node appended.\n");
  218.  
  219.         if (saveNode && saveChangeFlag)
  220.         {
  221.             var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  222.             RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
  223.             var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
  224.             dump("Got bookmarks datasource.\n");
  225.  
  226.             // XXX once we support multi-column editing, get the property
  227.             // from the column in the content model
  228.             var propertyName = "http://home.netscape.com/NC-rdf#Name";
  229.             var propertyNode = RDF.GetResource(propertyName, true);
  230.             dump("  replacing value of property '" + propertyName + "'\n");
  231.  
  232.             // get the URI
  233.             var theNode = saveNode;
  234.             var bookmarkURL = "";
  235.             while(true)
  236.             {
  237.                 var tag = theNode.nodeName;
  238.                 if (tag == "treeitem")
  239.                 {
  240.                     bookmarkURL = theNode.getAttribute("id");
  241.                     break;
  242.                 }
  243.                 theNode = theNode.parentNode;
  244.             }
  245.             dump("  uri is '" + bookmarkURL + "'\n");
  246.  
  247.             if (bookmarkURL == "")    return(false);
  248.             var bookmarkNode = RDF.GetResource(bookmarkURL, true);
  249.  
  250.  
  251.             dump("  newValue = '" + newValue + "'\n");
  252.             newValue = (newValue != "") ? RDF.GetLiteral(newValue) : null;
  253.  
  254.             var oldValue = Bookmarks.GetTarget(bookmarkNode, propertyNode, true);
  255.             if (oldValue)
  256.             {
  257.                 oldValue = oldValue.QueryInterface(Components.interfaces.nsIRDFLiteral);
  258.                 dump("  oldValue = '" + oldValue + "'\n");
  259.             }
  260.  
  261.             if (oldValue != newValue)
  262.             {
  263.                 if (oldValue && !newValue)
  264.                 {
  265.                     Bookmarks.Unassert(bookmarkNode, propertyNode, oldValue);
  266.                     dump("  Unassert used.\n");
  267.                 }
  268.                 else if (!oldValue && newValue)
  269.                 {
  270.                     Bookmarks.Assert(bookmarkNode, propertyNode, newValue, true);
  271.                     dump("  Assert used.\n");
  272.                 }
  273.                 else if (oldValue && newValue)
  274.                 {
  275.                     Bookmarks.Change(bookmarkNode, propertyNode, oldValue, newValue);
  276.                     dump("  Change used.\n");
  277.                 }
  278.  
  279.                 dump("re-writing bookmarks.html\n");
  280.                 var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
  281.                 remote.Flush();
  282.             }
  283.  
  284.             newValue = "";
  285.             saveNode = null;
  286.         }
  287.         else dump("saveNode was null?\n");
  288.         htmlInput = null;
  289.     }
  290.     else dump("htmlInput was null?\n");
  291.  
  292.     dump("CloseEditNode done.\n");
  293. }
  294.  
  295. function EditNodeKeyPress(event)
  296. {
  297.     if (event.keyCode == 27)
  298.     {
  299.         CloseEditNode(false);
  300.         return(false);
  301.     }
  302.     else if (event.keyCode == 13 || event.keyCode == 10)
  303.     {
  304.         CloseEditNode(true);
  305.         return(false);
  306.     }
  307.     return(true);
  308. }
  309.  
  310. function doSort(sortColName)
  311. {
  312.   var node = document.getElementById(sortColName);
  313.   // determine column resource to sort on
  314.   var sortResource = node.getAttribute('resource');
  315.   if (!node) return(false);
  316.  
  317.   var sortDirection="ascending";
  318.   var isSortActive = node.getAttribute('sortActive');
  319.   if (isSortActive == "true") {
  320.     var currentDirection = node.getAttribute('sortDirection');
  321.     if (currentDirection == "ascending")
  322.       sortDirection = "descending";
  323.     else if (currentDirection == "descending")
  324.       sortDirection = "natural";
  325.     else
  326.       sortDirection = "ascending";
  327.   }
  328.  
  329.   // get RDF Core service
  330.   var rdfCore = XPAppCoresManager.Find("RDFCore");
  331.   if (!rdfCore) {
  332.     rdfCore = new RDFCore();
  333.     if (!rdfCore) {
  334.       return(false);
  335.     }
  336.     rdfCore.Init("RDFCore");
  337. //    XPAppCoresManager.Add(rdfCore);
  338.   }
  339.   // sort!!!
  340.   rdfCore.doSort(node, sortResource, sortDirection);
  341.   return(false);
  342. }
  343.  
  344.  
  345. function fillContextMenu(name)
  346. {
  347.     if (!name)    return(false);
  348.     var popupNode = document.getElementById(name);
  349.     if (!popupNode)    return(false);
  350.  
  351.     // remove the menu node (which tosses all of its kids);
  352.     // do this in case any old command nodes are hanging around
  353.     var menuNode = popupNode.childNodes[0];
  354.     popupNode.removeChild(menuNode);
  355.  
  356.     // create a new menu node
  357.     menuNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menu");
  358.     popupNode.appendChild(menuNode);
  359.  
  360.     var treeNode = document.getElementById("bookmarksTree");
  361.     if (!treeNode)    return(false);
  362.     var db = treeNode.database;
  363.     if (!db)    return(false);
  364.  
  365.     var compositeDB = db.QueryInterface(Components.interfaces.nsIRDFDataSource);
  366.     if (!compositeDB)    return(false);
  367.  
  368.     var isupports = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  369.     if (!isupports)    return(false);
  370.     var rdf = isupports.QueryInterface(Components.interfaces.nsIRDFService);
  371.     if (!rdf)    return(false);
  372.  
  373.     var select_list = treeNode.selectedItems;
  374.     if (select_list.length < 1)    return(false);
  375.  
  376.     dump("# of Nodes selected: " + select_list.length + "\n\n");
  377.  
  378.     // perform intersection of commands over selected nodes
  379.     var cmdArray = new Array();
  380.  
  381.     for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++)
  382.     {
  383.         var node = select_list[nodeIndex];
  384.         if (!node)    break;
  385.         var id = node.getAttribute("id");
  386.         if (!id)    break;
  387.         var rdfNode = rdf.GetResource(id);
  388.         if (!rdfNode)    break;
  389.         var cmdEnum = db.GetAllCmds(rdfNode);
  390.         if (!cmdEnum)    break;
  391.  
  392.         var nextCmdArray = new Array();
  393.         while (cmdEnum.hasMoreElements())
  394.         {
  395.             var cmd = cmdEnum.getNext();
  396.             if (!cmd)    break;
  397.             if (nodeIndex == 0)
  398.             {
  399.                 cmdArray[cmdArray.length] = cmd;
  400.             }
  401.             else
  402.             {
  403.                 nextCmdArray[cmdArray.length] = cmd;
  404.             }
  405.         }
  406.         if (nodeIndex > 0)
  407.         {
  408.             // perform command intersection calculation
  409.             for (var cmdIndex = 0; cmdIndex < cmdArray.length; cmdIndex++)
  410.             {
  411.                 var    cmdFound = false;
  412.                 for (var nextCmdIndex = 0; nextCmdIndex < nextCmdArray.length; nextCmdIndex++)
  413.                 {
  414.                     if (nextCmdArray[nextCmdIndex] == cmdArray[cmdIndex])
  415.                     {
  416.                         cmdFound = true;
  417.                         break;
  418.                     }
  419.                 }
  420.                 if (cmdFound == false)
  421.                 {
  422.                     cmdArray[cmdIndex] = null;
  423.                 }
  424.             }
  425.         }
  426.     }
  427.  
  428.     // need a resource to ask RDF for each command's name
  429.     var rdfNameResource = rdf.GetResource("http://home.netscape.com/NC-rdf#Name");
  430.     if (!rdfNameResource)        return(false);
  431.  
  432.     // build up menu items
  433.     if (cmdArray.length < 1)    return(false);
  434.  
  435.     for (var cmdIndex = 0; cmdIndex < cmdArray.length; cmdIndex++)
  436.     {
  437.         var cmd = cmdArray[cmdIndex];
  438.         if (!cmd)        continue;
  439.         var cmdResource = cmd.QueryInterface(Components.interfaces.nsIRDFResource);
  440.         if (!cmdResource)    break;
  441.         var cmdNameNode = compositeDB.GetTarget(cmdResource, rdfNameResource, true);
  442.         if (!cmdNameNode)    break;
  443.         cmdNameLiteral = cmdNameNode.QueryInterface(Components.interfaces.nsIRDFLiteral);
  444.         if (!cmdNameLiteral)    break;
  445.         cmdName = cmdNameLiteral.Value;
  446.         if (!cmdName)        break;
  447.  
  448.         dump("Command #" + cmdIndex + ": id='" + cmdResource.Value + "'  name='" + cmdName + "'\n\n");
  449.  
  450.         var menuItem = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem");
  451.         menuItem.setAttribute("label", cmdName);
  452.         menuItem.setAttribute("onaction", "return doContextCmd('" + cmdResource.Value + "');");
  453.  
  454.         menuNode.appendChild(menuItem);
  455.     }
  456.  
  457.     return(true);
  458. }
  459.  
  460.  
  461.  
  462. function doContextCmd(cmdName)
  463. {
  464.   dump("doContextCmd start: cmd='" + cmdName + "'\n");
  465.  
  466.   var treeNode = document.getElementById("bookmarksTree");
  467.   if (!treeNode)    return(false);
  468.   var db = treeNode.database;
  469.   if (!db)    return(false);
  470.  
  471.   var compositeDB = db.QueryInterface(Components.interfaces.nsIRDFDataSource);
  472.   if (!compositeDB)    return(false);
  473.  
  474.   var isupports = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  475.   if (!isupports)    return(false);
  476.   var rdf = isupports.QueryInterface(Components.interfaces.nsIRDFService);
  477.   if (!rdf)    return(false);
  478.  
  479.   // need a resource for the command
  480.   var cmdResource = rdf.GetResource(cmdName);
  481.   if (!cmdResource)        return(false);
  482.   cmdResource = cmdResource.QueryInterface(Components.interfaces.nsIRDFResource);
  483.   if (!cmdResource)        return(false);
  484.  
  485.   var select_list = treeNode.selectedItems;
  486.   if (select_list.length < 1)    return(false);
  487.  
  488.   dump("# of Nodes selected: " + select_list.length + "\n\n");
  489.  
  490.   // set up selection nsISupportsArray
  491.   var selectionInstance = Components.classes["@mozilla.org/supports-array;1"].createInstance();
  492.   var selectionArray = selectionInstance.QueryInterface(Components.interfaces.nsISupportsArray);
  493.  
  494.   // set up arguments nsISupportsArray
  495.   var argumentsInstance = Components.classes["@mozilla.org/supports-array;1"].createInstance();
  496.   var argumentsArray = argumentsInstance.QueryInterface(Components.interfaces.nsISupportsArray);
  497.  
  498.   // get argument (parent)
  499.   var parentArc = rdf.GetResource("http://home.netscape.com/NC-rdf#parent");
  500.   if (!parentArc)        return(false);
  501.  
  502.   for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++)
  503.   {
  504.     var node = select_list[nodeIndex];
  505.     if (!node)    break;
  506.     var uri = node.getAttribute("ref");
  507.     if ((uri) || (uri == ""))
  508.     {
  509.       uri = node.getAttribute("id");
  510.     }
  511.     if (!uri)    return(false);
  512.  
  513.     var rdfNode = rdf.GetResource(uri);
  514.     if (!rdfNode)    break;
  515.  
  516.     // add node into selection array
  517.     selectionArray.AppendElement(rdfNode);
  518.  
  519.     // get the parent's URI
  520.     var parentURI="";
  521.     var theParent = node;
  522.     while (theParent)
  523.     {
  524.       theParent = theParent.parentNode;
  525.  
  526.       parentURI = theParent.getAttribute("ref");
  527.       if ((!parentURI) || (parentURI == ""))
  528.       {
  529.         parentURI = theParent.getAttribute("id");
  530.       }
  531.       if (parentURI != "")  break;
  532.     }
  533.     if (parentURI == "")    return(false);
  534.  
  535.     var parentNode = rdf.GetResource(parentURI, true);
  536.     if (!parentNode)  return(false);
  537.  
  538.     // add parent arc and node into arguments array
  539.     argumentsArray.AppendElement(parentArc);
  540.     argumentsArray.AppendElement(parentNode);
  541.   }
  542.  
  543.   // do the command
  544.   compositeDB.DoCommand( selectionArray, cmdResource, argumentsArray );
  545.  
  546.   dump("doContextCmd ends.\n\n");
  547.   return(true);
  548. }
  549.  
  550. // ripped from tasksOverlay.js.. ideally we should
  551. // put it back there (eventually).
  552. function toEditor(url)
  553. {
  554.     window.openDialog( "chrome://editor/content/EditorAppShell.xul", "_blank", "chrome,dialog=no,all", url );
  555. }
  556.